1 module hip.loaders.texture;
2 import hip.filesystem.hipfs;
3 import hip.asset_manager.load_task;
4 import hip.assetmanager;
5 import hip.api.data.commons;
6 import hip.console.log;
7 import hip.assets.texture;
8 
9 final class HipTextureLoadTask : HipAssetLoadTask
10 {
11     private IHipFSPromise fs;
12     private HipResourceUsage usage = HipResourceUsage.Immutable;
13     this(string path, string name, HipAsset asset, const(ubyte)[] extraData, string fileRequesting, size_t lineRequesting)
14     {
15         super(path,name,asset,extraData, fileRequesting,lineRequesting);
16         if(extraData.length)
17         {
18             assert(extraData.length == HipResourceUsage.sizeof);
19             usage = *cast(HipResourceUsage*)extraData.ptr;
20         }
21     }
22 
23     override void update()
24     {
25         final switch(result) with (HipAssetResult)
26         {
27             case waiting:
28                 result = loading;
29                 worker = HipAssetManager.loadWorker("Load and Decode Texture", ()
30                 {
31                     fs = HipFS.read(path)
32                     .addOnError((string error){result = cantLoad; this.error = error; })
33                     .addOnSuccess((in ubyte[] data)
34                     {
35                         asset = new Image(path, data, (IImage self)
36                         {
37                             result = mainThreadLoading;
38                         }, (){ result = cantLoad; error = "Could not decode image for Texture."; });
39                         return FileReadResult.keep;
40                     });
41                 });
42                 break;
43             case loading:
44                 break;
45             case mainThreadLoading:
46                 HipTexture t = new HipTexture(cast(Image)asset, usage);
47                 asset = t;
48                 hiplog("AssetManager: Texture: Loaded ", path, " ", t.toHipString.toString);
49                 result = loaded;
50                 break;
51             case cantLoad: goto case loaded;
52             case loaded:
53                 if(fs !is null)
54                 {
55                     fs.dispose();
56                     fs = null;
57                 }
58                 break;
59         }
60     }
61 
62 }